#include <stdio.h>
#include <stdlib.h>

double f1(double x);
double f2(double x);
#define STEP 0.1

int main()
{
    int i;
    double x, (*p)(double); // double (*p)(double)与double (*p)( )等效
    for (i = 0; i < 2; i++)
    {
        printf("第%d个方程：\n", i + 1);
        if (i == 0)
        // 给函数指针变量赋值时，只需要给出函数名而不必给出参数。
        // 将函数入口地址赋给函数指针变量p，而不涉及实参与形参结合的问题
            p = f1; // 函数指针变量
        else
            p = f2;
        for (x = -1; x <= 1; x += STEP)
            printf("%f\t%f\n", x, (*p)(x));
    }
    system("pause");
    return 0;
}

// 函数 f1
double f1(double x)
{
    return (x * x * x - 5 * x + 6);
}

// 函数f2
double f2(double x)
{
    return (x * x - 3 * x);
}

/*
在C语言中，指针函数与函数指针是不同的
    指针函数
        指向函数的指针变量
        指针变量指向整型变量、字符变量及字符串、浮点变量和数组。
        其实，指针变量也可以指向一个函数。
        因为尽管函数本身不是一个变量，但它在内存中仍然有其物理地址。
        赋给指针变量的地址就是函数的入口地址，从而该指针就可以用来代替函数名。
        这一特性也使得函数可以作为实参传递给其他函数。
    函数指针变量可以完成对函数的调用。
        其原理是通过把一个函数赋给一个函数指针变量，
        然后又通过该函数指针变量来完成对函数的引用。

与过去所讲的变量的重要区别是：
    它只能指向函数的入口处，而不能指向函数中间的具体指令。
    \*（p+1）、p+n、p--及p++等运算对它都是没有意义的。

“double（*p）（）；”语句仅仅说明定义的p是一个指向函数的指针变量，
此函数带回实型的返回值。

但它并不是固定指向哪一个函数的，而只是表示定义了这样一个类型的变量，
专门用来存放函数的入口地址。
*/